// 用户状态管理
import {
	LoginApi
} from '@/api/Loginapi.js';

class UserManager {
	constructor() {
		// 初始化用户状态
		this.user = uni.getStorageSync('user_info') || null
		this.isLogin = !!this.user
		this.loginRes = null // 保存登录凭证
	}

	// 检查是否已登录（同步验证内存和本地存储）
	checkLogin() {
		// 从本地存储重新读取，确保数据同步
		const storedUser = uni.getStorageSync('user_info')

		// 如果本地存储没有数据，更新内存状态
		if (!storedUser) {
			this.user = null
			this.isLogin = false
			return false
		}

		// 如果本地存储有数据，但内存中没有，同步到内存
		if (storedUser && !this.user) {
			this.user = storedUser
			this.isLogin = true
		}

		return this.isLogin
	}

	// 获取用户信息
	getUserInfo() {
		return this.user
	}

	// 微信登录（仅获取登录凭证）
	async wxLogin() {
		return new Promise((resolve, reject) => {
			// 调用微信登录接口
			uni.login({
				provider: 'weixin',
				success: (loginRes) => {
					console.log('微信登录成功', loginRes)
					this.loginRes = loginRes // 保存登录凭证
					resolve(loginRes)
				},
				fail: (err) => {
					console.error('微信登录失败', err)
					uni.showToast({
						title: '登录失败，请重试',
						icon: 'none'
					})
					reject(err)
				}
			})
		})
	}

	// 获取用户信息（必须由用户主动点击触发）
	async getUserProfile() {
		// 检查是否有登录凭证
		if (!this.loginRes) {
			uni.showToast({
				title: '请先登录',
				icon: 'none'
			})
			return Promise.reject('请先登录')
		}

		return new Promise((resolve, reject) => {
			uni.getUserProfile({
				desc: '用于完善会员资料',
				success: (userRes) => {
					console.log('获取用户信息成功', userRes)
					// 完成登录流程
					this.completeLogin(this.loginRes, userRes)
						.then(userInfo => {
							resolve(userInfo)
						})
						.catch(err => {
							reject(err)
						})
				},
				fail: (err) => {
					console.error('获取用户信息失败', err)
					uni.showToast({
						title: '获取用户信息失败',
						icon: 'none'
					})
					reject(err)
				}
			})
		})
	}

	// 完成登录流程（结合登录凭证和用户信息）
	async completeLogin(loginRes, userRes) {
		// 构造用户信息对象，为后续后端登录预留字段
		const userInfo = {
			id: null,
			nickName: userRes.userInfo.nickName,
			avatarUrl: userRes.userInfo.avatarUrl,
			gender: userRes.userInfo.gender,
			country: userRes.userInfo.country,
			province: userRes.userInfo.province,
			city: userRes.userInfo.city,
			language: userRes.userInfo.language,
			// 后端返回的额外字段
			points: 0,
			vipLevel: 0,
			healthScore: 0,
			petCount: 0,
			token: null,
			retoken: null,
			userId: null
		}

		try {
			// 调用后端登录接口
			const res = await LoginApi.login({
				code: loginRes.code,
				nickName: userInfo.nickName,
				avatarUrl: userInfo.avatarUrl
			});

			if (res.data.code == 200) {
				console.log('后端登录成功', res)
				// 正确处理响应头大小写问题
				const newToken = res.header['authorization'] || res.header['Authorization'];
				const resToken = res.header['retoken'] || res.header['Retoken'];
				// 保存后端返回的认证信息
				const backendData = res.data.data;
				// this.updateUserInfo(backendData)
				userInfo.id = 'user_' + backendData.userId
				userInfo.nickName = backendData.nickName
				userInfo.avatarUrl = backendData.avatarUrl
				userInfo.points = backendData.points
				userInfo.vipLevel = backendData.vipLevel
				userInfo.healthScore = backendData.healthScore
				userInfo.petCount = backendData.petCount
				userInfo.userId = backendData.userId
				userInfo.gender = backendData.gender
				// 保存用户信息
				this.user = userInfo
				this.isLogin = true
				uni.setStorageSync('user_info', userInfo)
				uni.setStorageSync('token', newToken)
				uni.setStorageSync('retoken', resToken)
				// 清除登录凭证
				this.loginRes = null

				// 通知所有页面登录状态已更改
				uni.$emit('loginStatusChanged', true)

				// 返回用户信息
				return userInfo
			} else {
				console.error('后端登录失败', res)
				uni.showToast({
					title: '登录失败，请重试',
					icon: 'none'
				})
				// 登录失败时，确保用户状态为未登录
				this.user = null
				this.isLogin = false
				this.loginRes = null
				// 通知所有页面登录状态已更改
				uni.$emit('loginStatusChanged', false)

				// 抛出错误
				throw new Error('后端登录失败: ' + res.data.message)
			}
		} catch (err) {
			console.error('后端登录失败', err)
			uni.showToast({
				title: '登录失败，请重试',
				icon: 'none'
			})
			// 登录失败时，确保用户状态为未登录
			this.user = null
			this.isLogin = false
			this.loginRes = null
			// 通知所有页面登录状态已更改
			uni.$emit('loginStatusChanged', false)

			// 抛出错误
			throw err
		}
	}

	// 退出登录
	logout() {
		// 清空内存中的用户数据
		this.user = null
		this.isLogin = false
		this.loginRes = null

		// 清空所有本地存储的用户相关数据
		uni.removeStorageSync('user_info')
		uni.removeStorageSync('token')
		uni.removeStorageSync('retoken')

		// 清空聊天相关数据（可选，根据需求决定是否保留）
		// uni.removeStorageSync('chatList')
		// uni.removeStorageSync('totalUnReadNum')
		// uni.removeStorageSync('unreadCounts')

		// 通知所有页面登录状态已更改
		uni.$emit('loginStatusChanged', false)

		console.log('用户已退出登录，所有本地数据已清理')

		uni.showToast({
			title: '已退出登录',
			icon: 'none'
		})
	}

	// 更新用户信息（为后续后端功能预留）
	updateUserInfo(userInfo) {
		this.user = {
			...this.user,
			...userInfo
		}
		uni.setStorageSync('user_info', this.user)
	}

	// 设置访问令牌（为后续后端功能预留）
	setAccessToken(token, refreshToken, expiresIn) {
		if (this.user) {
			this.user.token = token
			this.user.retoken = refreshToken
			uni.setStorageSync('user_info', this.user)
		}
	}
}

// 创建单例实例
const userManager = new UserManager()

export default userManager